/*!
    \file    main.c
    \brief   Bootloader main function and device management
    \author  赵一凡 (tutustr@163.com)
    \version V1.0.0
    \date    2024-01-10

    \note    Bootloader for GD32F470ZGT6
    \copyright Copyright (c) 2024 赵一凡. All rights reserved.
*/
#include "boot_update.h"
#include "device_info.h"
#include "gd32f4xx.h"
#include "gd32f4xx_gpio.h"
#include "gd32f4xx_rcu.h"
#include "gd32f4xx_usart.h"
#include "led.h"
#include "systick.h"
#include <stdio.h>

int main(void)
{
    systick_config();
    device_pin_init();
    /* 初始化定时器变量 */
    uint32_t led_timer = 0;
    delay_init(&led_timer);

    /* 检查应用程序是否有效 */
    if (check_app_valid())
    {
        /* LED快闪两下表示即将跳转到应用程序 */
        for (uint8_t i = 0; i < 4; i++)
        {
            led_toggle(LED1);
            delay_1ms(100);
        }
        /* 跳转到应用程序 */
        execute_user_code();
    }
    /* 如果应用程序无效或需要更新，进入bootloader模式 */
    update_init();
    while (1)
    {
        /* 处理升级数据 */
        update_process();
        /* 使用非阻塞方式处理LED闪烁，每500ms闪烁一次 */
        if (delay_check(&led_timer, 1000))
        {
            led_toggle(LED1);
            frame_t frame={0};
            memcpy(frame.data, "asdc", 4);
            send_frame(&frame);
        }
        /* 这里可以添加其他非阻塞任务 */
    }
}
